%    Copyright (C) 1994, 1995 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: gs_pfile.ps,v 1.5 2003/08/08 18:45:05 ray Exp $
% Runtime support for minimum-space fonts and packed files.

% ****** NOTE: This file must be kept consistent with
% ****** packfile.ps and wrfont.ps.

% ---------------- Packed file support ---------------- %

% A packed file is the concatenation of several file groups, each of which
% is the result of compressing several files concatenated together.
% The packed file begins with a procedure that creates an appropriate
% decoding filter for each file group, as follows:
%	<group-subfile-filter> -proc- <group-decode-filter>
% Thus, accessing an individual file requires 4 parameters:
% the starting address and length of the outer compressed file,
% and the starting address and length of the inner file.
/.packedfilefilter	% <file> <ostart> <olength> <istart> <ilength>
			%   .packedfilefilter <filter>
 { 4 index systemdict begin token pop end 6 1 roll
	% Stack: fproc file ostart olength istart ilength
   4 index 5 -1 roll setfileposition
	% Stack: fproc file olength istart ilength
   4 -2 roll () /SubFileDecode filter
	% Stack: fproc istart ilength ofilter
   4 -1 roll exec
	% Filters don't support setfileposition, so we must skip data
	% by reading it into a buffer.  We rely on the fact that
	% save/restore don't affect file positions.
	% Stack: istart ilength dfilter
   save exch 64000 string
	% Stack: istart ilength save dfilter scratch
   4 index 1 index length idiv { 2 copy readstring pop pop } repeat
   2 copy 0 8 -1 roll 2 index length mod getinterval readstring pop pop pop
	% Stack: ilength save dfilter
   exch restore exch () /SubFileDecode filter
 } bind def

% Run a packed library file.
/.runpackedlibfile	% <filename> <ostart> <olength> <istart> <ilength>
			%   .runpackedlibfile
 { 5 -1 roll findlibfile
    { exch pop dup 6 2 roll .packedfilefilter
      currentobjectformat exch 1 setobjectformat run
      setobjectformat closefile
    }
    { 5 1 roll /findlibfile load /undefinedfilename signalerror
    }
   ifelse
 } bind def

% ---------------- Compacted font support ---------------- %

% Compacted fonts written by wrfont.ps depend on the existence and
% specifications of the procedures and data in this section.

/.compactfontdefault mark
	/PaintType 0
	/FontMatrix [0.001 0 0 0.001 0 0] readonly
	/FontType 1
	/Encoding StandardEncoding
.dicttomark readonly def

/.checkexistingfont	% <fontname> <uid> <privatesize> <fontsize>
			%   .checkexistingfont
			%   {} (<font> on d-stack)
			% <fontname> <uid> <privatesize> <fontsize>
			%   .checkexistingfont
			%   -save- --restore-- (<font> on d-stack)
 { FontDirectory 4 index .knownget
    { dup /UniqueID .knownget
       { 4 index eq exch /FontType get 1 eq and }
       { pop false }
      ifelse
    }
    { false
    }
   ifelse
    { save /restore load 6 2 roll }
    { {} 5 1 roll }
   ifelse
   dict //.compactfontdefault exch .copydict begin
   dict /Private exch def
   Private begin
     /MinFeature {16 16} def
     /Password 5839 def
     /UniqueID 1 index def
   end
   /UniqueID exch def
   /FontName exch def
 } bind def

/.knownEncodings [
   ISOLatin1Encoding
   StandardEncoding
   SymbolEncoding
] readonly def

/.readCharStrings	% <count> <encrypt> .readCharStrings <dict>
 { exch dup dict dup 3 -1 roll
    { currentfile token pop dup type /integertype eq
       { dup -8 bitshift //.knownEncodings exch get exch 255 and get } if
      currentfile token pop dup type /nametype eq
       { 2 index exch get
       }
       {	% Stack: encrypt dict dict key value
	 4 index { 4330 exch dup .type1encrypt exch pop } if
	 readonly
       }
      ifelse put dup
    }
   repeat pop exch pop
 } bind def
